/** 
 * Classe contenente i metodi per effettuare tutte le query utilizzate dal sistema
 * @author Alessandro  Nasso
 * @version  1.0
 */

package beans;

//------------------------------------- import -------------------------------------------------------------
import java.sql.*;
//import java.io.*;  
//----------------------------------------------------------------------------------------------------------

import com.mchange.v2.c3p0.ComboPooledDataSource;


public class Query1 {

	public Query1() {
	}
	
	

	//metodo per prelevare dati dal database

	// ho inserito nella prima riga dei risultati i nomi delle varie colonne così posso conoscere la colonna a cui fare riferimento dalla comparazione
	// del nome e non dal numero del risultato

	public String[][] getDati(String query){
		ResultSet result=null;
		Connection conn = null;
		Statement st = null;
		try{	
			conn= DBConnection.getDataSource().getConnection();
			st = conn.createStatement();
			result = st.executeQuery(query);
			if(result.next()){

				result.beforeFirst();

				int num_righe=0;
				int numeroColonne=0;
				
				//Calcolo il numero di righe
				while(result.next()){
					num_righe++;
				}
				//Calcolo il numero di colonne
				ResultSetMetaData rsmd=result.getMetaData();
				numeroColonne=rsmd.getColumnCount();

				// creo un vettore per contenere i nomi delle colonne
				String[] nomeColonna= new String[numeroColonne];

				//creo una matrice di stringhe della dimensione delle righe e delle colonne del ResultSet
				//numero di righe + uno perchè nella prima riga metto i nomi delle colonne
				String arraystringhe[][] = new String[num_righe+1][numeroColonne];

				// ottengo i nomi delle colonne
				//inserisco nella prima riga della matrice con i risultati i nomi delle colonne 
				for(int i=1; i<=numeroColonne; i++){ 
					arraystringhe[0][i-1]= nomeColonna[i-1]=rsmd.getColumnLabel(i);
				}

				//sposta il resultset prima della prima riga per tornare nella posizione iniziale
				result.beforeFirst();

				//ciclo per ottenere i risultati
				int i=1;
				while(result.next()){
					for(int j=0;j<numeroColonne;j++){
						// prelevo i risultati sotto forma di stringhe
						arraystringhe[i][j]=result.getString(nomeColonna[j]);
						// 2. scrittura di test 
						// out.println(arraystringhe[i][j]);
					}

					i++; 
				}

				return arraystringhe;
			}
			else 
				return null; 
		} catch (Exception e) {
			System.out.println("Query1: SQL Exception (getDati)");
			e.printStackTrace();
		} finally {
			try {
				st.close();
				conn.close();
				result.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		} 
		//se fallisce il try restituisco null
		return null;
	}
	
	public Connection getConn(){
		try {
			return DBConnection.getDataSource().getConnection();
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return null;
	}


	public ResultSet executeQuery(String query){
		ResultSet result=null;
		Connection conn = null;
		Statement st = null;
		try{
//			System.out.println("query da eseguire: "+query);
			conn= DBConnection.getDataSource().getConnection();
			st = conn.createStatement();
			result=st.executeQuery(query);
			st.close();
		} catch (Exception e){
			System.out.println("Query1: Error while executing DB query (executeQuery)");
			e.printStackTrace();
		} finally {
			try {
				st.close();
				conn.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		} 
		return result;
	}

	public int executeUpdate(String query){
		int toRet = 0;
		Connection conn = null;
		Statement st = null;
		try{
//			System.out.println("UPDATE da eseguire: "+query);
			conn= DBConnection.getDataSource().getConnection();
			st = conn.createStatement();
			toRet=st.executeUpdate(query);
		} catch (Exception e){
			System.out.println("Query1: Error while executing DB update (executeUpdate)");
			e.printStackTrace();
		} finally {
			try {
				st.close();
				conn.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		} 
		return toRet;
	}

}
